
<?php
	/**
	* 核心类
	* @author zhufu <zhufu159239@163.com>
	* @version 1.0
	* @date 2012-07-13 15:51:18
	*/
	class core extends cooperation{

		public static $message;   //消息类
		public static $comment;   //评论类
		public static $logs;   //日志类
		public static $user;      //用户类

		//类名字
		private $obj_ary = array('message', 'comment', 'logs', 'user');

		/**
		* 构造函数
		*
		* @return void
		*/
		public function __construct() {

		}

		/**
		* 析构函数
		*
		* @return void
		*/
		public function __destruct() {

		}

		/**
		* 魔术方法获取类
		*
		* @author zhouqi 2012-7-16 PM 01:19:34
		* @param string $name  名称
		*/
		public function __get($name) {
			if(!in_array($name, $this->obj_ary)) {
				return;
			}

			if(!self::$$name) {
				self::$$name = new $name();
			}

			return self::$$name;
		}

		/**
		* 用于phped代码自动完成
		*
		*/
		private function auto_complete() {
			self::$message = new message();
			self::$comment = new comment();
			self::$logs = new logs();
			self::$user = new user();
		}


		/**
		* 写入数据库
		* @author <zhufu159239@163.com> 2012-07-13 16:05:44
		*
		* @param string $table      要操作的表名
		* @param array $data        要设置的数据
		* @param boolean $insert    是否为插入，true（默认）为插入，false为更新
		* @param string $wherestr   如果是更新，加上要更新筛选条件
		* @param int $base          数据库 key 值
		*/
		public function set_db($table, $data, $insert=true, $wherestr='', $base=0){
			F('_fields/'.$table,null);
			$data = check_keys($data, '', $table);
			if(!$data || empty($data) || !is_array($data)){
				//没有有效值
				return false;
			}

			if($insert){
				//插入
				foreach($data as $k=>$v){
					$keys .= '`' . $k . '`,';
					$vals .= "'{$v}',";
				}
				$keys = trim($keys, ',');
				$vals = trim($vals, ',');
				$sql = "insert into {$table} ({$keys}) values ({$vals})";
				return $this->_mysql($base)->insert($sql);
			}

			if(!$wherestr){
				//没有where，且没有id作为默认的where,返回false
				return false;
			}
			//主键不能修改
			$format_array = F("_fields/{$table}");

			if(isset($data[$format_array['_pk']])){
				//不能更新 主键
				unset($data[$format_array['_pk']]);
			}

			$str = '';
			foreach($data as $k=>$v){
				$str .= "`{$k}`='{$v}',";
			}
			$str = trim($str, ',');
			$sql = "update {$table} set {$str} where 1";

			if($wherestr) {
				$sql .= " AND {$wherestr}";
			}

			return $this->_mysql($base)->query($sql, true);
		}

		/**
		* 得到分类列表
		* @author <zhufu159239@163.com> 2012-07-18 14:39:02
		*
		* @param string $table  分类列名
		* @param int $base      数据库
		* @return array
		*/
		public function cat_list($table, $base=0){
			//缓存文件名
			$filename = "cat/{$table}";
			$cache = F($filename);
			if(!$cache){
				$sql = "SELECT * FROM {$table} ORDER BY `pid` ASC,sort DESC";
				$list = $this->_mysql($base)->find($sql);
				if(!$list){
					return false;
				}
				$cache = array();
				foreach($list as $k=>$v){
					if($v['pid'] == 0){
						$cache[$v['id']] = $v;
					}else{
						if(!$cache[$v['pid']]['child']){
							$cache[$v['pid']]['child'] = array();
						}
						$cache[$v['pid']]['child'][] = $v;
					}
				}
				F($filename, $cache);
			}
			return $cache;
		}


		/**
		* 调用用户缓存API
		*
		* @author zhouqi 2012-6-12 PM 14:04:36
		* @param string $action    动作
		* @param string $path  路径
		* @param string $rtn   返回值
		* @param string $model 模块
		*/
		public function cache_api($action, $path, $rtn = 'json', $model = 'user') {
			global $_site;
			if(!$action || !$path) {
				return false;
			}
			$_config = $this->_config();
			switch($model){
				case 'user':
					if(!$this->user_cache_host) {
						$this->user_cache_host = $_config['cache_user']['host'];
						$this->user_cache_port = $_config['cache_user']['port'];
					}
					$url = "http://{$this->user_cache_host}:{$this->user_cache_port}/?model={$model}&action={$action}&format={$rtn}&{$path}";
					break;
				case 'company':
					$url = 'http://' . $_config['cache_company']['domain'] . "/handle.php?h=ucenter/{$action}&{$path}";
					break;
				default:break;
			}


			//进行接口登陆
			$result = dfopen($url);
			if($rtn == 'json') {
				$result = str_replace(array("\n", "\r"), '', $result);
				$result = json_decode($result, true);
				$result =is_array($result)?array_pop($result):$result;
				$result['state'] = $result['state'] == 'true' ? true : false;
				return $result;
			}

		}

		/**
		* 保存图片
		* @author limin  2013-07-01  PM 19:48:00
		* @param string $var 表单名
		*/
		public function save_img($var='img'){
			global $_site;
			if(!$_FILES[$var]){
				return false;
			}
			//如果是post提交
			$size = $_site->site_config['site']['upload_pic_size'] * 1024 * 1024;
			$path = "/{$_site->site_config['site']['upload_dir']}/image/" . date('Y/m/d/');
			$name = time() . mt_rand(1000,9999);
			//IOS上传的图片没有后缀，这里进行手动添加
			$pathinfo = pathinfo($_FILES[$var]['name']);
			if(!$pathinfo['extension']){
				$_FILES[$var]['name'] .= '.jpg';
			}
			$result = $_site->_file()->upload_file($var, $_site->_root() . $path, $size, true, $name);
			if(!$result){
				return false;

			}
			return $result;
		}

		/**
		* 将上传的图片切出三个客户端需要的尺寸
		* @author zhufu 2013-03-12 19:57:24
		*
		* @param string $path 图片所在的路径，相对 /data/upload....
		*/
		public function _img_thumb_make($var='img'){
			global $_site;
			$result = $this->save_img($var);
	    //兼容处理已存在的图片问题；原来程序只支持处理上传的图片
			if(!$result){

				$p = pathinfo($var);
				$result['folder'] = $p['dirname'];
				$result['name'] = $p['basename'];
			}
			//压缩图片生成缩略图
			$re_o_width = 800 ;
			$re_o_height = 600 ;
			$re_b_width = 400 ;
			$re_b_height = 300 ;
			$re_w_width = 200 ;
			$re_w_height = 150 ;
			$re_m_width = 96 ;
			$re_m_height = 72 ;
			$re_o_ext = img_thumb($result['name'], $re_o_width.'x'.$re_o_height );
			$re_b_ext = img_thumb($result['name'], $re_b_width.'x'.$re_b_height );
			$re_w_ext = img_thumb($result['name'], $re_w_width.'x'.$re_w_height );
			$re_m_ext = img_thumb($result['name'], $re_m_width.'x'.$re_m_height );


			$r = $_site->_file()->image_make_thumb_adv($result['folder'],$result['name'],0,0,0,0,$re_o_width,$re_o_height,$re_o_ext,array('quality'=>90,'fill_margin'=>false,'cut_center'=>true),$re_o_ext);
			if(!$r){
				return false;
			}
			//如果上传图片的大小小于压缩比例的大小则无需压缩
			$r = $_site->_file()->image_make_thumb_adv($result['folder'],$result['name'],0,0,0,0,$re_b_width,$re_b_height,$re_b_ext,array('quality'=>90,'fill_margin'=>false,'cut_center'=>true),$re_b_ext);
			if(!$r){
				return false;
			}
			$r = $_site->_file()->image_make_thumb_adv($result['folder'],$result['name'],0,0,0,0,$re_w_width,$re_w_height,$re_w_ext,array('quality'=>90,'fill_margin'=>false,'cut_center'=>true),$re_w_ext);                                                                                   if(!$r){
				return false;
			}

			//生成缩略图
			$r = $_site->_file()->image_make_thumb_adv($result['folder'],$result['name'],0,0,0,0,$re_m_width,$re_m_height,$re_m_ext,array('quality'=>90,'fill_margin'=>false,'cut_center'=>true),$re_m_ext);
			if(!$r){
				return false;
			}
			return strstr($result['folder'],'/data') . $result['name'];
		}

		/**
		* 裁剪上传的图片
		* @author zhufu 2013-06-03
		*
		* @param string $path 图片路径,原图，相对地址
		* @param int $width 宽度
		* @param int $height 高度
		* @param int $inc_ary 更多参数
		*/
		public function image_process($path, $width, $height, $inc_ary=false){
			$tmp = $this->_root() . $path;
			$ext = "{$width}x{$height}";
			$tmp2 = img_thumb($tmp, $ext);

			if(is_file($tmp2)){
				return true;
			}
			//png格式的小图要被放大，所以小图不能被拉伸
			if(!isset($inc_ary['fill_margin'])){
				$inc_ary['fill_margin'] = false;
			}
			$pathinfo = pathinfo($tmp);
			$ext_adv = "_{$ext}";
			return $this->_file()->image_make_thumb_adv($pathinfo['dirname'], $pathinfo['basename'], 0,0,0,0,$width,$height,'',$inc_ary, $pathinfo['basename'].$ext_adv.".{$pathinfo['extension']}");
		}

		/**
		* 发送短信
		* @author limin 2013-8-11 PM 18:03:00
		* @param  string $phone
		* @param  array  $info  摇奖活动信息(包含摇奖名称title，审核状态state，以及发布时间)
		* @param  string  $reason  不通过原因
		*/
		public function send_msg($phone,$info,$reason=''){
			if(!$phone||!$info['state']||!$info['title']||!$info['time']){
				return false;
			}
			$state_str=($info['state']==1)?'已通过审核':'未通过审核';
			$date_str=date('Y-m-d',$info['time']);
			$msg="尊敬的商户，您于{$date_str}发布的摇奖活动“{$info['title']}”{$state_str},";
			if(($info['state']==2)&&$reason){
				$msg.='原因:'.$reason.',请进行修改之后重新提交';
			}else{
				$msg.='快去查看吧';
			}

			return true;    //测试的时候不发短信


			return $this->sms_send($phone,$msg);
		}

		/**
		* 短信发送接口
		* @author zhufu 2013-07-29
		* @param mobile $phone 手机号
		* @param string $msg 消息内容
		*/
		protected function sms_send($phone, $msg){
			if(!is_mobile($phone) || !$msg){
				return false;
			}
			return $this->_sms()->sms_send($phone, $msg);
		}

        
        /**
        * memcache设置和读取方法
        * @author zhufu 2013-10-14
        *
        * @param string $key 键
        * @param mixed $value 值，默认为 '',表示读取，有值的字符串为设置值，false 为清除
        * @param int $expire 过期时间，默认为0 不过期
        */
        public function memcache_v2($key, $value='', $expire=0){
            //检查是否开启了 Memcache
            $config = $this->_config();
            if(!$config['memcache']){
                return false;
            }

            if(!$key){
                return false;
            }
            //键值处理
            if($config['memcache']['project']){
                $key = $config['memcache']['project'] . ':' . $key;
            }
            $key = md5($key);

            if($value === false){
                return $this->_memcache()->_del($key);
            }
            if($value){
                return $this->_memcache()->_set($key, $value, $expire);
            }
            $result = $this->_memcache()->_get($key);
            return $result ? $result[0] : $result;
        }
        
        
		/**
		* memcache设置和读取方法
		* @author zhufu 2013-10-14
        * @author zhufu 2014-03-20 该方法在些做兼容，不能使用
		*
		* @param string $key 键
		* @param mixed $value 值，默认为 '',表示读取，有值的字符串为设置值，false 为清除
		* @param int $expire 过期时间，默认为0 不过期
		*/
		public function memcache($key, $value='', $expire=0){
			//检查是否开启了 Memcache
			$config = $this->_config();
			if(!$config['memcache'] || !$config['memcache']['valid']){
				return false;
			}

			if(!$key){
				return false;
			}
			//键值处理
			if($config['memcache']['project']){
				$key = $config['memcache']['project'] . ':' . $key;
			}
			$key = md5($key);

			if($value === false){
				return $this->_memcache()->_del($key);
			}
			if($value){
				return $this->_memcache()->_set($key, $value, $expire);
			}
			$result = $this->_memcache()->_get($key);
			return $result ? $result[0] : $result;
		}

		/**
		* memcache封装 mysql 的 findlimit
		* @author zhufu 2013-10-15
		*
		* @param string $sql 查询语句
		* @param int $page 当前页
		* @param int $pagesize 每页显示数量
		* @param boolean $nomemcache 是否使用 memcache ，默认为 true 使用
		*/
		public function memcache_findlimit($sql, $page=1, $pagesize=10, $memcache=true, $expire=0){
			global $_site;
			//取消小区通的全部缓存
			return $this->_mysql(0)->findlimit($sql,$page,$pagesize);
			if(!$memcache){
				//不缓存直接查询数据库
				return $this->_mysql(0)->findlimit($sql,$page,$pagesize);
			}
			//没有指定过期时间，但又设置了统一的过期时间，则使用统一的过期时间
			if(!$expire && $_site->site_config['memcache']['expire']){
				$expire = $_site->site_config['memcache']['expire'];
			}
			//得到缓存
			$key = $sql.$page.$pagesize;
			$list = $this->memcache($key);
			//有数据直接返回
			if($list){
				return $list;
			}
			//没有数据，先查询。
			$list = $this->_mysql(0)->findlimit($sql, $page, $pagesize);
			//将结果设置到 memcache中
			$this->memcache($key, $list, $expire);
			return $list;
		}

		/**
		* memcache封装 mysql 的 find
		* @author zhufu 2013-10-15
		*
		* @param string $sql sql语句
		* @param string $memcache 是否需要 memcache ， 默认为 true 使用
		* @param string $expire 有效期
		*/
		public function memcache_find($sql, $memcache=true, $expire=0){
			global $_site;
			//取消小区通的全部缓存
			return $this->_mysql(0)->find($sql);
			if(!$memcache){
				//不缓存直接查询数据库
				return $this->_mysql(0)->find($sql);
			}
			//没有指定过期时间，但又设置了统一的过期时间，则使用统一的过期时间
			if(!$expire && $_site->site_config['memcache']['expire']){
				$expire = $_site->site_config['memcache']['expire'];
			}
			//得到缓存
			$key = $sql;
			$list = $this->memcache($key);
			//有数据直接返回
			if($list){
				return $list;
			}
			//没有数据先查询
			$list = $this->_mysql(0)->find($sql);
			//将结果设置到 memcache中
			$this->memcache($key, $list, $expire);
			return $list;
		}

		/**
		* memcache封装 mysql 的 findone
		* @author zhufu 2013-10-15
		*
		* @param string $sql sql语句
		* @param string $memcache 是否需要 memcache ， 默认为 true 使用
		* @param string $expire 有效期
		*/
		public function memcache_findone($sql, $memcache=true, $expire=0){
			global $_site;
			//取消小区通的全部缓存
			return $this->_mysql(0)->findone($sql);

			if(!$memcache){
				//不缓存直接查询数据库
				return $this->_mysql(0)->findone($sql);
			}
			//得到缓存
			//没有指定过期时间，但又设置了统一的过期时间，则使用统一的过期时间
			if(!$expire && $_site->site_config['memcache']['expire']){
				$expire = $_site->site_config['memcache']['expire'];
			}
			//得到缓存
			$key = $sql;
			$list = $this->memcache($key);
			//有数据直接返回
			if($list){
				return $list;
			}
			//没有数据先查询
			$list = $this->_mysql(0)->findone($sql);
			//将结果设置到 memcache中
			$this->memcache($key, $list, $expire);
			return $list;
		}
        
        
        /**
        * 自动表单验证
        * @author zhufu 2013-08-24
        *
        * @param string $modelname 模块名称
        */
        public function auto_check($modelname=''){
            if(!$modelname){
                $modelname = get_class($this);
            }

            //得到模块的主键
            $table = 'syt_' . $modelname;
            $cachefile = "_fields/{$table}";
            $format_array = F($cachefile);
            if(!$format_array) {
                $format_array = $this->_mysql(0)->flush($table);
                F($cachefile, $format_array);
            }
            //得到主键
            $pk = $format_array['_pk'];
            //得到模块表单配置
            $modelfile = $this->_root() . "/model/{$modelname}.php";
            $config = require $modelfile;
            //没有配置，说明是默认
            if(!$config || !$config['_autocheck']){
                return true;
            }
            if(isset($_GET[$pk])){
                $pk_val = $_GET[$pk];
            }

            foreach($config['_autocheck'] as $k=>$v){
                if($v[4] == 1 && $pk_val){
                    //新增数据时验证,但主键有值，则不进行检查
                    continue;
                }
                if($v[4] == 2 && !$pk_val){
                    //编辑数据时，但没有主键
                    continue;
                }
                $value = $_GET[$k];
                //处理附加规则
                if($v[3]){
                    switch($v[3]){
                        case 'length':
                            $min = $v[0][0];
                            $max = $v[0][1];
                            $len = character_length_ch($value);
                            if($len < $min || ($max && $len > $max)){
                                return $v[1];
                            }
                            break;
                        case 'between':
                            $min = $v[0][0];
                            $max = $v[0][1];
                            if($min && $value < $min){
                                return $v[1];
                            }
                            if($max && $value > $max){
                                return $v[1];
                            }
                            break;
                    }
                }
                else{
                    if(!$v[2] && !isset($value)){
                        continue;
                    }
                    if($v[2]==2 && !$value){
                        continue;
                    }
                    switch($v[0]){
                        case 'require':
                            if(!$value){
                                return $v[1];
                            }
                            break;
                        case 'number':
                            if(!is_numeric($value)){
                                return $v[1];
                            }
                            break;
                    }
                }
            }
            return true;
        }
	}


?>